// 前置路由导航守卫
import router from './router'
import store from './store/index.js'
import { asyncRoutes } from '@/router/index.js'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import { Message } from 'element-ui'
NProgress.configure({ showSpinner: false }) // NProgress Configuration 关闭旋转进度条

const whiteList = ['/login', '/404'] // 白名单 不需要token也能访问的页面

// 路由前置导航守卫
router.beforeEach(async(to, from, next) => {
  // start progress bar 进度条开启
  NProgress.start()
  // 是否有token
  if (store.getters.token) {
    // 有token 并且还要访问登录页 是不允许的 所有跳转到 组织架构路由页
    if (to.path === '/login') {
      // Message({ message: '您已处于登录状态', duration: 1500 })
      // 如果去的是登录页 并且已经有用户id了 则发送提示
      if (store.getters.userId) Message({ message: '您已处于登录状态', duration: 1500 })
      next('/')
      // 如果next()里面存放了地址 则不会走后置守卫 需要手动关闭进度条
      NProgress.done()
    } else {
      // 去获取用户信息(如果没有userId 则获取一次) 后面获取过了则不再次获取
      if (!store.getters.userId) {
        // 在得到用户数据后 去跳转页面
        const { roles: { menus }} = await store.dispatch('user/getUserInfo') // 拿到用户信息里面的menus 得到可以访问哪些路由
        const filterRoutes = asyncRoutes.filter(item => {
          return menus.includes(item.name) // 筛选asyncRoutes是否包含menu里面地址
        })// filterRoutes筛选后的路由
        store.commit('user/SetRoutes', filterRoutes) // 将动态路由 存到仓库 (左侧侧边栏)
        // 404页面必须兜底
        router.addRoutes([...filterRoutes, { path: '*', redirect: '/404', hidden: true }]) // 添加动态路由到路由表 (网页网址)
        next(to.path) // 目的是让路由拥有信息 router的已知缺陷
        NProgress.done()
      } else {
        next()
      }
    }
  } else {
    // 没有token去到的页面是登录页或者404页面
    if (whiteList.includes(to.path)) {
      next()
    } else {
      next('/login')
      // 如果next()里面存放了地址 则不会走后置守卫 需要手动关闭进度条
      NProgress.done()
    }
  }
})
// 路由后置导航守卫
router.afterEach(() => {
  // finish progress bar
  // 进度条关闭
  NProgress.done()
})
